package com.rong.juc_test.juc_p6_p7;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 学习AQS
 */
public class AQSDemo {
    public static void main(String[] args) {
        Lock lock = new ReentrantLock();
        // A B C三个顾客，去银行办理业务，A先到 此时窗口空无一人，她优先获得办理窗口的机会
        // A办理业务耗时严重
        new Thread(() -> {
            lock.lock();
            try {
                System.out.println("A来办理业务");
                try {
                    TimeUnit.MINUTES.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }finally {
                lock.unlock();
            }
        },"A").start();

        // B顾客来办理业务，此时窗口被A占领，只能去候客区等待，进入AQS队列，等待A办理完成 尝试去抢占手里窗口
        new Thread(() -> {
            lock.lock();
            try {
                System.out.println("B来办理业务");
            }finally {
                lock.unlock();
            }
        },"B").start();

        // C是第3个顾客，此时A占用窗口，只能去等候区，进入AQS队列，等待A完成 尝试抢占窗口，前面是B 若进入队列 则遵循FIFO原则
        new Thread(() -> {
            lock.lock();
            try {
                System.out.println("C来办理业务");
            }finally {
                lock.unlock();
            }
        },"C").start();
    }
}
